Skip to content

feat(slack): Add Slack Agent DM and assistant thread support for Seer Explorer#112493

Merged
leeandher merged 19 commits intomasterfrom
leanderrodrigues/iswf-2388-explore-slack-dms-agent-interface-for-seer-explorer
Apr 10, 2026
Merged

feat(slack): Add Slack Agent DM and assistant thread support for Seer Explorer#112493
leeandher merged 19 commits intomasterfrom
leanderrodrigues/iswf-2388-explore-slack-dms-agent-interface-for-seer-explorer

Conversation

@leeandher
Copy link
Copy Markdown
Member

@leeandher leeandher commented Apr 8, 2026

this allows DMs to the bot trigger Seer and gives a richer experience for starting conversations by suggesting prompts. to support this locally, you need to do a few things

  • Enable Agent + AI App for Slack App
  • Add the assistant:write OAuth scope
  • Add event subscriptions for assistant_thread_started

Also updated the linkage flow a bit, to better support dms

Refs ISWF-2388

@linear-code
Copy link
Copy Markdown

linear-code bot commented Apr 8, 2026

@github-actions github-actions bot added the Scope: Backend Automatically applied to PRs that change backend components label Apr 8, 2026
@leeandher leeandher marked this pull request as ready for review April 8, 2026 21:44
@leeandher leeandher requested review from a team as code owners April 8, 2026 21:44
leeandher and others added 6 commits April 10, 2026 10:02
Add the assistant:write scope to the Slack integration to enable
the bot to act as a Slack Agent, supporting DM-based agent interfaces.

Refs ISWF-2388
Co-Authored-By: Claude Opus 4.6 <noreply@example.com>
Extract shared org-resolution logic into _resolve_seer_organization helper
and merge on_app_mention/on_dm into a single _handle_seer_mention method.
Replace three identical halt reason enums with unified SeerSlackHaltReason.
Extract duplicated loading messages list into a module-level constant.

Refs ISWF-2388
Co-Authored-By: Claude Opus 4.6 <noreply@example.com>
…nges

Update tests to match the refactored _resolve_seer_organization which
now iterates org integrations and uses SlackExplorerEntrypoint.has_access
instead of checking a single feature flag. Align halt reasons with the
consolidated enum values (NO_VALID_INTEGRATION, NO_VALID_ORGANIZATION)
and update the has_access test for the seer-slack-explorer flag rename.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Address PR review feedback:
- Change SLACK_PROVIDERS from set to list to match the RPC method's
  expected `list[str]` parameter type, preventing serialization errors
- Check org status before calling get_installation to avoid unnecessary
  queries for inactive orgs
- Verify the requesting Slack user belongs to the resolved org when
  their identity is linked, preventing cross-org data access when
  multiple orgs share a Slack workspace
- Fix inaccurate comments about DM fallback behavior

Refs ISWF-2388
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@leeandher leeandher force-pushed the leanderrodrigues/iswf-2388-explore-slack-dms-agent-interface-for-seer-explorer branch from 5b77767 to 6f4a9d9 Compare April 10, 2026 14:02
leeandher and others added 5 commits April 10, 2026 11:57
…uests

Move identity verification to the start of org resolution so unlinked
users receive an ephemeral prompt with a link button instead of silently
failing downstream. Introduce SeerResolutionResult TypedDict to replace
the tuple-or-None return pattern, add a static ephemeral message helper
on SlackIntegration, and simplify DM dispatch by routing assistant-scoped
integrations through the mention handler.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Narrow handler signatures from SlackDMRequest to SlackEventRequest for
better type safety. Extract channel_id, user_id, and thread_ts
properties on SlackEventRequest to handle assistant_thread_started event
structure differences in one place. Rename on_app_mention to on_prompt
and is_assistant to has_assistant_scope for clarity. Add contextual
messaging to the identity link prompt based on event type.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Remove the ts fallback from SlackEventRequest.thread_ts so top-level
messages correctly yield None instead of collapsing into the message ts.
Add missing return type annotations to has_assistant_scope and
is_assistant_thread_event. Move variable extraction before org
resolution in _handle_seer_prompt for earlier lifecycle context.
@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Apr 10, 2026

Backend Test Failures

Failures on dfb95ac in this run:

tests/sentry/integrations/slack/webhooks/events/test_app_mention.py::AppMentionEventTest::test_app_mention_non_threaded_dispatches_tasklog
[gw0] linux -- Python 3.13.1 /home/runner/work/sentry/sentry/.venv/bin/python3
tests/sentry/integrations/slack/webhooks/events/test_app_mention.py:71: in test_app_mention_non_threaded_dispatches_task
    assert kwargs["thread_ts"] is None
E   AssertionError: assert '' is None
tests/sentry/integrations/slack/webhooks/events/test_message_im.py::MessageIMDmAgentTest::test_dm_dispatches_tasklog
[gw1] linux -- Python 3.13.1 /home/runner/work/sentry/sentry/.venv/bin/python3
tests/sentry/integrations/slack/webhooks/events/test_message_im.py:230: in test_dm_dispatches_task
    assert kwargs["thread_ts"] is None
E   AssertionError: assert '' is None

Copy link
Copy Markdown
Member

@alexsohn1126 alexsohn1126 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good, a couple of small things, should be good to push after!

Move DM agent tests from test_message_im into a dedicated
test_direct_message module. Simplify link_identity using
create_identity helper and set up linked identities in setUp
so individual tests only need to opt out. Revert thread_ts
return type to str with or-None coercion at the call site.
@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Apr 10, 2026

Backend Test Failures

Failures on 581f885 in this run:

tests/sentry/integrations/slack/webhooks/events/test_discover_link_shared.py::DiscoverLinkSharedEvent::test_share_discover_links_unlinked_user_no_channellog
[gw1] linux -- Python 3.13.1 /home/runner/work/sentry/sentry/.venv/bin/python3
.venv/lib/python3.13/site-packages/django/db/backends/utils.py:105: in _execute
    return self.cursor.execute(sql, params)
src/sentry/db/postgres/decorators.py:16: in inner
    return func(self, *args, **kwargs)
src/sentry/db/postgres/base.py:95: in execute
    return self.cursor.execute(sql, params)
E   psycopg2.errors.UniqueViolation: duplicate key value violates unique constraint "sentry_identityprovider_type_external_id_d44bac97_uniq"
E   DETAIL:  Key (type, external_id)=(slack, TXXXXXXX1) already exists.

The above exception was the direct cause of the following exception:
tests/sentry/integrations/slack/webhooks/events/test_discover_link_shared.py:180: in test_share_discover_links_unlinked_user_no_channel
    self.create_identity_provider(type="slack", external_id="TXXXXXXX1")
src/sentry/testutils/fixtures.py:652: in create_identity_provider
    return Factories.create_identity_provider(integration=integration, config=config, **kwargs)
/opt/hostedtoolcache/Python/3.13.1/x64/lib/python3.13/contextlib.py:85: in inner
    return func(*args, **kwds)
src/sentry/testutils/factories.py:2004: in create_identity_provider
    return IdentityProvider.objects.create(config=config or {}, **kwargs)
src/sentry/silo/base.py:157: in override
    return original_method(*args, **kwargs)
.venv/lib/python3.13/site-packages/django/db/models/manager.py:87: in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
src/sentry/silo/base.py:157: in override
    return original_method(*args, **kwargs)
.venv/lib/python3.13/site-packages/django/db/models/query.py:665: in create
    obj.save(force_insert=True, using=self.db)
src/sentry/silo/base.py:157: in override
    return original_method(*args, **kwargs)
.venv/lib/python3.13/site-packages/django/db/models/base.py:902: in save
    self.save_base(
src/sentry/silo/base.py:157: in override
    return original_method(*args, **kwargs)
.venv/lib/python3.13/site-packages/django/db/models/base.py:1008: in save_base
    updated = self._save_table(
.venv/lib/python3.13/site-packages/django/db/models/base.py:1169: in _save_table
    results = self._do_insert(
.venv/lib/python3.13/site-packages/django/db/models/base.py:1210: in _do_insert
    return manager._insert(
.venv/lib/python3.13/site-packages/django/db/models/manager.py:87: in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
.venv/lib/python3.13/site-packages/django/db/models/query.py:1873: in _insert
    return query.get_compiler(using=using).execute_sql(returning_fields)
.venv/lib/python3.13/site-packages/django/db/models/sql/compiler.py:1882: in execute_sql
    cursor.execute(sql, params)
.venv/lib/python3.13/site-packages/django/db/backends/utils.py:122: in execute
    return super().execute(sql, params)
.venv/lib/python3.13/site-packages/sentry_sdk/utils.py:1870: in runner
    return original_function(*args, **kwargs)
.venv/lib/python3.13/site-packages/django/db/backends/utils.py:79: in execute
... (23 more lines)
tests/sentry/integrations/slack/webhooks/events/test_discover_link_shared.py::DiscoverLinkSharedEvent::test_share_discover_links_linked_user_sdklog
[gw0] linux -- Python 3.13.1 /home/runner/work/sentry/sentry/.venv/bin/python3
.venv/lib/python3.13/site-packages/django/db/backends/utils.py:105: in _execute
    return self.cursor.execute(sql, params)
src/sentry/db/postgres/decorators.py:16: in inner
    return func(self, *args, **kwargs)
src/sentry/db/postgres/base.py:95: in execute
    return self.cursor.execute(sql, params)
E   psycopg2.errors.UniqueViolation: duplicate key value violates unique constraint "sentry_identityprovider_type_external_id_d44bac97_uniq"
E   DETAIL:  Key (type, external_id)=(slack, TXXXXXXX1) already exists.

The above exception was the direct cause of the following exception:
tests/sentry/integrations/slack/webhooks/events/test_discover_link_shared.py:201: in test_share_discover_links_linked_user_sdk
    idp = self.create_identity_provider(type="slack", external_id="TXXXXXXX1")
src/sentry/testutils/fixtures.py:652: in create_identity_provider
    return Factories.create_identity_provider(integration=integration, config=config, **kwargs)
/opt/hostedtoolcache/Python/3.13.1/x64/lib/python3.13/contextlib.py:85: in inner
    return func(*args, **kwds)
src/sentry/testutils/factories.py:2004: in create_identity_provider
    return IdentityProvider.objects.create(config=config or {}, **kwargs)
src/sentry/silo/base.py:157: in override
    return original_method(*args, **kwargs)
.venv/lib/python3.13/site-packages/django/db/models/manager.py:87: in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
src/sentry/silo/base.py:157: in override
    return original_method(*args, **kwargs)
.venv/lib/python3.13/site-packages/django/db/models/query.py:665: in create
    obj.save(force_insert=True, using=self.db)
src/sentry/silo/base.py:157: in override
    return original_method(*args, **kwargs)
.venv/lib/python3.13/site-packages/django/db/models/base.py:902: in save
    self.save_base(
src/sentry/silo/base.py:157: in override
    return original_method(*args, **kwargs)
.venv/lib/python3.13/site-packages/django/db/models/base.py:1008: in save_base
    updated = self._save_table(
.venv/lib/python3.13/site-packages/django/db/models/base.py:1169: in _save_table
    results = self._do_insert(
.venv/lib/python3.13/site-packages/django/db/models/base.py:1210: in _do_insert
    return manager._insert(
.venv/lib/python3.13/site-packages/django/db/models/manager.py:87: in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
.venv/lib/python3.13/site-packages/django/db/models/query.py:1873: in _insert
    return query.get_compiler(using=using).execute_sql(returning_fields)
.venv/lib/python3.13/site-packages/django/db/models/sql/compiler.py:1882: in execute_sql
    cursor.execute(sql, params)
.venv/lib/python3.13/site-packages/django/db/backends/utils.py:122: in execute
    return super().execute(sql, params)
.venv/lib/python3.13/site-packages/sentry_sdk/utils.py:1870: in runner
    return original_function(*args, **kwargs)
.venv/lib/python3.13/site-packages/django/db/backends/utils.py:79: in execute
... (23 more lines)
tests/sentry/integrations/slack/webhooks/events/test_explore_link_shared.py::ExploreLinkSharedEvent::test_share_explore_links_linked_userlog
[gw1] linux -- Python 3.13.1 /home/runner/work/sentry/sentry/.venv/bin/python3
.venv/lib/python3.13/site-packages/django/db/backends/utils.py:105: in _execute
    return self.cursor.execute(sql, params)
src/sentry/db/postgres/decorators.py:16: in inner
    return func(self, *args, **kwargs)
src/sentry/db/postgres/base.py:95: in execute
    return self.cursor.execute(sql, params)
E   psycopg2.errors.UniqueViolation: duplicate key value violates unique constraint "sentry_identityprovider_type_external_id_d44bac97_uniq"
E   DETAIL:  Key (type, external_id)=(slack, TXXXXXXX1) already exists.

The above exception was the direct cause of the following exception:
tests/sentry/integrations/slack/webhooks/events/test_explore_link_shared.py:117: in test_share_explore_links_linked_user
    idp = self.create_identity_provider(type="slack", external_id="TXXXXXXX1")
src/sentry/testutils/fixtures.py:652: in create_identity_provider
    return Factories.create_identity_provider(integration=integration, config=config, **kwargs)
/opt/hostedtoolcache/Python/3.13.1/x64/lib/python3.13/contextlib.py:85: in inner
    return func(*args, **kwds)
src/sentry/testutils/factories.py:2004: in create_identity_provider
    return IdentityProvider.objects.create(config=config or {}, **kwargs)
src/sentry/silo/base.py:157: in override
    return original_method(*args, **kwargs)
.venv/lib/python3.13/site-packages/django/db/models/manager.py:87: in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
src/sentry/silo/base.py:157: in override
    return original_method(*args, **kwargs)
.venv/lib/python3.13/site-packages/django/db/models/query.py:665: in create
    obj.save(force_insert=True, using=self.db)
src/sentry/silo/base.py:157: in override
    return original_method(*args, **kwargs)
.venv/lib/python3.13/site-packages/django/db/models/base.py:902: in save
    self.save_base(
src/sentry/silo/base.py:157: in override
    return original_method(*args, **kwargs)
.venv/lib/python3.13/site-packages/django/db/models/base.py:1008: in save_base
    updated = self._save_table(
.venv/lib/python3.13/site-packages/django/db/models/base.py:1169: in _save_table
    results = self._do_insert(
.venv/lib/python3.13/site-packages/django/db/models/base.py:1210: in _do_insert
    return manager._insert(
.venv/lib/python3.13/site-packages/django/db/models/manager.py:87: in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
.venv/lib/python3.13/site-packages/django/db/models/query.py:1873: in _insert
    return query.get_compiler(using=using).execute_sql(returning_fields)
.venv/lib/python3.13/site-packages/django/db/models/sql/compiler.py:1882: in execute_sql
    cursor.execute(sql, params)
.venv/lib/python3.13/site-packages/django/db/backends/utils.py:122: in execute
    return super().execute(sql, params)
.venv/lib/python3.13/site-packages/sentry_sdk/utils.py:1870: in runner
    return original_function(*args, **kwargs)
.venv/lib/python3.13/site-packages/django/db/backends/utils.py:79: in execute
... (23 more lines)
tests/sentry/integrations/slack/webhooks/events/test_discover_link_shared.py::DiscoverLinkSharedEvent::test_share_discover_links_unlinked_user_no_channel_sdklog
[gw0] linux -- Python 3.13.1 /home/runner/work/sentry/sentry/.venv/bin/python3
.venv/lib/python3.13/site-packages/django/db/backends/utils.py:105: in _execute
    return self.cursor.execute(sql, params)
src/sentry/db/postgres/decorators.py:16: in inner
    return func(self, *args, **kwargs)
src/sentry/db/postgres/base.py:95: in execute
    return self.cursor.execute(sql, params)
E   psycopg2.errors.UniqueViolation: duplicate key value violates unique constraint "sentry_identityprovider_type_external_id_d44bac97_uniq"
E   DETAIL:  Key (type, external_id)=(slack, TXXXXXXX1) already exists.

The above exception was the direct cause of the following exception:
tests/sentry/integrations/slack/webhooks/events/test_discover_link_shared.py:193: in test_share_discover_links_unlinked_user_no_channel_sdk
    self.create_identity_provider(type="slack", external_id="TXXXXXXX1")
src/sentry/testutils/fixtures.py:652: in create_identity_provider
    return Factories.create_identity_provider(integration=integration, config=config, **kwargs)
/opt/hostedtoolcache/Python/3.13.1/x64/lib/python3.13/contextlib.py:85: in inner
    return func(*args, **kwds)
src/sentry/testutils/factories.py:2004: in create_identity_provider
    return IdentityProvider.objects.create(config=config or {}, **kwargs)
src/sentry/silo/base.py:157: in override
    return original_method(*args, **kwargs)
.venv/lib/python3.13/site-packages/django/db/models/manager.py:87: in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
src/sentry/silo/base.py:157: in override
    return original_method(*args, **kwargs)
.venv/lib/python3.13/site-packages/django/db/models/query.py:665: in create
    obj.save(force_insert=True, using=self.db)
src/sentry/silo/base.py:157: in override
    return original_method(*args, **kwargs)
.venv/lib/python3.13/site-packages/django/db/models/base.py:902: in save
    self.save_base(
src/sentry/silo/base.py:157: in override
    return original_method(*args, **kwargs)
.venv/lib/python3.13/site-packages/django/db/models/base.py:1008: in save_base
    updated = self._save_table(
.venv/lib/python3.13/site-packages/django/db/models/base.py:1169: in _save_table
    results = self._do_insert(
.venv/lib/python3.13/site-packages/django/db/models/base.py:1210: in _do_insert
    return manager._insert(
.venv/lib/python3.13/site-packages/django/db/models/manager.py:87: in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
.venv/lib/python3.13/site-packages/django/db/models/query.py:1873: in _insert
    return query.get_compiler(using=using).execute_sql(returning_fields)
.venv/lib/python3.13/site-packages/django/db/models/sql/compiler.py:1882: in execute_sql
    cursor.execute(sql, params)
.venv/lib/python3.13/site-packages/django/db/backends/utils.py:122: in execute
    return super().execute(sql, params)
.venv/lib/python3.13/site-packages/sentry_sdk/utils.py:1870: in runner
    return original_function(*args, **kwargs)
.venv/lib/python3.13/site-packages/django/db/backends/utils.py:79: in execute
... (23 more lines)
tests/sentry/integrations/slack/webhooks/events/test_discover_link_shared.py::DiscoverLinkSharedEvent::test_share_discover_links_unlinked_user_sdklog
[gw0] linux -- Python 3.13.1 /home/runner/work/sentry/sentry/.venv/bin/python3
.venv/lib/python3.13/site-packages/django/db/backends/utils.py:105: in _execute
    return self.cursor.execute(sql, params)
src/sentry/db/postgres/decorators.py:16: in inner
    return func(self, *args, **kwargs)
src/sentry/db/postgres/base.py:95: in execute
    return self.cursor.execute(sql, params)
E   psycopg2.errors.UniqueViolation: duplicate key value violates unique constraint "sentry_identityprovider_type_external_id_d44bac97_uniq"
E   DETAIL:  Key (type, external_id)=(slack, TXXXXXXX1) already exists.

The above exception was the direct cause of the following exception:
tests/sentry/integrations/slack/webhooks/events/test_discover_link_shared.py:161: in test_share_discover_links_unlinked_user_sdk
    self.create_identity_provider(type="slack", external_id="TXXXXXXX1")
src/sentry/testutils/fixtures.py:652: in create_identity_provider
    return Factories.create_identity_provider(integration=integration, config=config, **kwargs)
/opt/hostedtoolcache/Python/3.13.1/x64/lib/python3.13/contextlib.py:85: in inner
    return func(*args, **kwds)
src/sentry/testutils/factories.py:2004: in create_identity_provider
    return IdentityProvider.objects.create(config=config or {}, **kwargs)
src/sentry/silo/base.py:157: in override
    return original_method(*args, **kwargs)
.venv/lib/python3.13/site-packages/django/db/models/manager.py:87: in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
src/sentry/silo/base.py:157: in override
    return original_method(*args, **kwargs)
.venv/lib/python3.13/site-packages/django/db/models/query.py:665: in create
    obj.save(force_insert=True, using=self.db)
src/sentry/silo/base.py:157: in override
    return original_method(*args, **kwargs)
.venv/lib/python3.13/site-packages/django/db/models/base.py:902: in save
    self.save_base(
src/sentry/silo/base.py:157: in override
    return original_method(*args, **kwargs)
.venv/lib/python3.13/site-packages/django/db/models/base.py:1008: in save_base
    updated = self._save_table(
.venv/lib/python3.13/site-packages/django/db/models/base.py:1169: in _save_table
    results = self._do_insert(
.venv/lib/python3.13/site-packages/django/db/models/base.py:1210: in _do_insert
    return manager._insert(
.venv/lib/python3.13/site-packages/django/db/models/manager.py:87: in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
.venv/lib/python3.13/site-packages/django/db/models/query.py:1873: in _insert
    return query.get_compiler(using=using).execute_sql(returning_fields)
.venv/lib/python3.13/site-packages/django/db/models/sql/compiler.py:1882: in execute_sql
    cursor.execute(sql, params)
.venv/lib/python3.13/site-packages/django/db/backends/utils.py:122: in execute
    return super().execute(sql, params)
.venv/lib/python3.13/site-packages/sentry_sdk/utils.py:1870: in runner
    return original_function(*args, **kwargs)
.venv/lib/python3.13/site-packages/django/db/backends/utils.py:79: in execute
... (23 more lines)
tests/sentry/integrations/slack/webhooks/events/test_explore_link_shared.py::ExploreLinkSharedEvent::test_share_explore_links_unlinked_userlog
[gw0] linux -- Python 3.13.1 /home/runner/work/sentry/sentry/.venv/bin/python3
.venv/lib/python3.13/site-packages/django/db/backends/utils.py:105: in _execute
    return self.cursor.execute(sql, params)
src/sentry/db/postgres/decorators.py:16: in inner
    return func(self, *args, **kwargs)
src/sentry/db/postgres/base.py:95: in execute
    return self.cursor.execute(sql, params)
E   psycopg2.errors.UniqueViolation: duplicate key value violates unique constraint "sentry_identityprovider_type_external_id_d44bac97_uniq"
E   DETAIL:  Key (type, external_id)=(slack, TXXXXXXX1) already exists.

The above exception was the direct cause of the following exception:
tests/sentry/integrations/slack/webhooks/events/test_explore_link_shared.py:99: in test_share_explore_links_unlinked_user
    self.create_identity_provider(type="slack", external_id="TXXXXXXX1")
src/sentry/testutils/fixtures.py:652: in create_identity_provider
    return Factories.create_identity_provider(integration=integration, config=config, **kwargs)
/opt/hostedtoolcache/Python/3.13.1/x64/lib/python3.13/contextlib.py:85: in inner
    return func(*args, **kwds)
src/sentry/testutils/factories.py:2004: in create_identity_provider
    return IdentityProvider.objects.create(config=config or {}, **kwargs)
src/sentry/silo/base.py:157: in override
    return original_method(*args, **kwargs)
.venv/lib/python3.13/site-packages/django/db/models/manager.py:87: in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
src/sentry/silo/base.py:157: in override
    return original_method(*args, **kwargs)
.venv/lib/python3.13/site-packages/django/db/models/query.py:665: in create
    obj.save(force_insert=True, using=self.db)
src/sentry/silo/base.py:157: in override
    return original_method(*args, **kwargs)
.venv/lib/python3.13/site-packages/django/db/models/base.py:902: in save
    self.save_base(
src/sentry/silo/base.py:157: in override
    return original_method(*args, **kwargs)
.venv/lib/python3.13/site-packages/django/db/models/base.py:1008: in save_base
    updated = self._save_table(
.venv/lib/python3.13/site-packages/django/db/models/base.py:1169: in _save_table
    results = self._do_insert(
.venv/lib/python3.13/site-packages/django/db/models/base.py:1210: in _do_insert
    return manager._insert(
.venv/lib/python3.13/site-packages/django/db/models/manager.py:87: in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
.venv/lib/python3.13/site-packages/django/db/models/query.py:1873: in _insert
    return query.get_compiler(using=using).execute_sql(returning_fields)
.venv/lib/python3.13/site-packages/django/db/models/sql/compiler.py:1882: in execute_sql
    cursor.execute(sql, params)
.venv/lib/python3.13/site-packages/django/db/backends/utils.py:122: in execute
    return super().execute(sql, params)
.venv/lib/python3.13/site-packages/sentry_sdk/utils.py:1870: in runner
    return original_function(*args, **kwargs)
.venv/lib/python3.13/site-packages/django/db/backends/utils.py:79: in execute
... (23 more lines)

Extract ASSISTANT_THREAD as a typed dict[str, Any] to avoid
mypy index errors from mixed-type dict value inference.
Convert LINK_SHARED_EVENT from JSON string to native dict and
reuse BaseEventTest.link_identity and idp instead of manually
creating identity providers and identities in each test.
The identity link prompt can be sent for top-level messages where
thread_ts is None. Update the signature to accept str | None and
reorder params to group slack_user_id with integration.
Add dict[str, Any] annotations to LINK_SHARED_EVENT and
LINK_SHARED_EVENT_NO_CHANNEL_NAME to fix mixed-type inference.
Remove leftover orjson.loads() calls and fix int-indexing on
the now-dict event data.
Copy link
Copy Markdown
Contributor

@cursor cursor bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit ec363ba. Configure here.

@leeandher leeandher merged commit 9c4470c into master Apr 10, 2026
58 checks passed
@leeandher leeandher deleted the leanderrodrigues/iswf-2388-explore-slack-dms-agent-interface-for-seer-explorer branch April 10, 2026 21:12
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Scope: Backend Automatically applied to PRs that change backend components

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants